package com.mixsmart.core.service;

import java.util.HashMap;
import java.util.List;

import com.mixsmart.core.bean.Paginate;
import com.mixsmart.core.bean.entity.IEntityBean;
import com.mixsmart.spellsql.ICondition;

/**
 * 查询服务类--接口
 * 定义了一些基于SQL或HQL语句查询的方法
 * @author lmq
 * @version 1.0
 * @since JDK版本大于等于1.6
 * 2016年1月15日
 */
public interface IQueryService {
	
	/**
	 * 根据条件查询数据
	 * @param clazz
	 * @param condition 条件对象
	 * @return 返回实体对象
	 */
	public <E> E find(Class<? extends IEntityBean> clazz,ICondition condition);
	
	/**
	 * 根据条件查数据
	 * @param clazz
	 * @param condition 条件对象
	 * @return 返回E对象集合
	 */
	public <E> List<E> finds(Class<? extends IEntityBean> clazz,ICondition condition);
	
	/**
	 * 根据SQL语句查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @return 返回对象数组列表
	 */
	public List<Object> queryObjSql(String sql,HashMap<String,Object> params);
	
	/**
	 * SQL语句通过参数过滤后查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @return 返回对象数组列表
	 */
	public List<Object> queryObjSqlFilter(String sql,HashMap<String,Object> params);
	
	/**
	 * 根据HQL语句查询
	 * @param hql HQL语句
	 * @param params Map参数
	 * @return 返回对象数组列表
	 */
	public List<Object> queryObjHql(String hql,HashMap<String,Object> params);
	
	/**
	 * HQL语句通过参数查询
	 * @param hql HQL语句
	 * @param params Map参数
	 * @return 返回对象数组列表
	 */
	public List<Object> queryObjHqlFilter(String hql,HashMap<String,Object> params);
	
	/**
	 * 根据SQL语句查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @param clazz 结果转换类型；Map或自定义的类等
	 * @return 返回clazz参数指定的对象列表
	 */
	public <E> List<E> querySql(String sql,HashMap<String,Object> params, Class<?> clazz);
	
	/**
	 * SQL语句通过参数过滤后查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @param clazz 结果转换类型；Map或自定义的类等
	 * @return 返回clazz参数指定的对象列表
	 */
	public <E> List<E> querySqlFilter(String sql,HashMap<String,Object> params, Class<?> clazz);
	
	/**
	 * 根据SQL语句分页查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<Object> queryObjSql(String sql,HashMap<String,Object> params, int pageNo,int pageSize);
	
	/**
	 * SQL语句通过参数过滤后分页查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<Object> queryObjSqlFilter(String sql,HashMap<String,Object> params, int pageNo,int pageSize);
	
	/**
	 * 根据SQL语句分页查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @param clazz 结果转换类型；Map或自定义的类等
	 * @return 返回分页对象
	 */
	public <E> Paginate<E> querySql(String sql,HashMap<String,Object> params, int pageNo,int pageSize, Class<?> clazz);
	
	/**
	 * SSQL语句通过参数过滤后分页查询
	 * @param sql SQL语句
	 * @param params Map参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @param clazz 结果转换类型；Map或自定义的类等
	 * @return 返回分页对象
	 */
	public <E> Paginate<E> querySqlFilter(String sql,HashMap<String,Object> params, int pageNo,int pageSize, Class<?> clazz);
	
	/**
	 * 统计
	 * @param sql SQL语句
	 * @param params 参数
	 * @return 如果没有数据或统计失败，返回：0；否则返回统计结果
	 */
	public long countSql(String sql,HashMap<String,Object> params);
	
	/**
	 * SQL语句通过参数过滤后统计
	 * @param sql SQL语句
	 * @param params 参数
	 * @return 如果没有数据或统计失败，返回：0；否则返回统计结果
	 */
	public long countSqlFilter(String sql,HashMap<String,Object> params);
	
}
